/*
 * Basado en el libro de Duane A. Bailey, "Java Structures", pág. 210
 */
package Hoja6;

import java.util.Iterator;

/**
 *
 * @param <E> 
 * @author María Fernanda Martínez
 */
public class SinglyLinkedListIterator<E> implements Iterator{
    /**
     * Valor actual
     */
    protected Node<E> current;
    /**
     * Cabeza
     */
    protected Node<E> head;
    
    /**
     * Nombre: SinglyLinkedListIterator
     * Descripción: constructor de la clase
     * Pre: no hay
     * Post: iterador que viaja a través de una linked list
     * No hay valor de retorno
     * @param t
     */
    public SinglyLinkedListIterator(Node<E> t)
    {
        head = t;
        reset();
    }
    
    /**
     * Nombre: reset
     * Descripción: regresa al inicio de la lista
     * Pre: no hay
     * Post: iterador esta al inicio de la lista
     * No hay valor de retorno ni parámetros
     */
    public void reset()
    {
        current = head;
    }
    
    /**
     * Nombre: hasNext
     * Descripción: verifica si existe un elemento más en la lista
     * Pre: no hay
     * Post: regresa true si hay más en la lista
     * No hay parámetros
     * @return 
     */
    @Override
    public boolean hasNext()           
    {
        return current != null;
    }
    
    /**
     * Nombre: next
     * Descripción: obtiene el siguiente elemento de la lista
     * Pre: la lista tiene siguiente elemento
     * Post: regresa el valor del siguiente elemento e incrementa iterador
     * No hay parámetro
     * @return
     */
    @Override
    public E next()
    {
        E temp = current.value();
        current = current.next();
        return temp;
    }

    /**
     * Nombre: remove
     * Descripción:
     * Pre:
     * Post:
     */
    @Override
    public void remove() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}
